package gui;

import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JLabel;

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JButton;
import javax.swing.JOptionPane;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.text.DecimalFormat;
import java.util.Observable;
import java.util.Observer;

import javax.swing.border.TitledBorder;

import restaurant.*;
import Usager.AbstractCompte;
import Usager.Client;
import carnetCommandes.*;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;

public class ClientPanel extends JPanel {

	// Instanciation des variables
	private Registre registre;
	private ListeRestaurant restos = ListeRestaurant.getInstance();

	// Instanciation des composants
	private JList listMenu;
	private JComboBox cbRestaurant;
	private final JList listCommande;
	private JButton btnSupprimer;
	private JButton btnQuitter;
	private JTextField tbQuantite;
	private JLabel lbClient;
	private JLabel lbClientInfo;
	private JButton btnAjouter;
	private JTextField tbDescription;
	private JTextField tbPrix;
	private JTextField tbTotal;
	private JButton btnConfirmer;

	/**
	 * Create the panel.
	 */
	public ClientPanel() {

		// Initialisation du layout
		setLayout(null);

		// Initialisation des variables
		registre = Registre.getInstance();

		// Quantite commandee
		tbQuantite = new JTextField();
		tbQuantite.setHorizontalAlignment(SwingConstants.CENTER);
		tbQuantite.setBounds(327, 117, 150, 20);
		tbQuantite.setText("1");
		tbQuantite.setColumns(10);
		add(tbQuantite);

		// ComboBo Restaurant
		cbRestaurant = new JComboBox(restos.getListe());
		cbRestaurant.setBounds(10, 85, 150, 20);
		cbRestaurant.addActionListener(new RestaurantListener());
		add(cbRestaurant);

		// Liste Commande
		listCommande = new JList();
		listCommande.setSize(152, 300);
		listCommande.setLocation(669, 85);
		listCommande.setBorder(new TitledBorder(UIManager
				.getBorder("TitledBorder.border"), "Votre Commande",
				TitledBorder.CENTER, TitledBorder.TOP, null, null));
		add(listCommande);

		// Liste Menu
		listMenu = new JList();
		listMenu.addListSelectionListener(new ProduitListener());
		listMenu.setBounds(170, 85, 150, 300);
		listMenu.setBorder(new TitledBorder(UIManager
				.getBorder("TitledBorder.border"), "Menu", TitledBorder.CENTER,
				TitledBorder.TOP, null, null));
		add(listMenu);

		// Label TitreTotal
		JLabel lbTitreTotal = new JLabel("Total");
		lbTitreTotal.setBounds(324, 368, 49, 14);
		add(lbTitreTotal);

		// Bouton Ajouter
		btnAjouter = new JButton("Ajouter");
		btnAjouter.setBounds(327, 84, 150, 23);
		btnAjouter.addActionListener(new AjouterListener());
		add(btnAjouter);

		// Bouton Supprimer
		btnSupprimer = new JButton("Supprimer");
		btnSupprimer.setBounds(509, 84, 150, 23);
		btnSupprimer.addActionListener(new SupprimerListener());
		add(btnSupprimer);

		// Bouton Quitter
		btnQuitter = new JButton("Quitter");
		btnQuitter.setBounds(669, 396, 150, 23);
		btnQuitter.addActionListener(new QuitterListener());
		add(btnQuitter);

		// Label des informations des client
		lbClient = new JLabel("");
		lbClient.setBounds(10, 11, 310, 14);
		add(lbClient);
		lbClientInfo = new JLabel("");
		lbClientInfo.setBounds(10, 36, 310, 14);
		add(lbClientInfo);

		// Description de produit
		tbDescription = new JTextField();
		tbDescription.setEditable(false);
		tbDescription.setBounds(327, 173, 329, 143);
		tbDescription.setColumns(10);
		add(tbDescription);

		JLabel lblTitreDescription = new JLabel("Description");
		lblTitreDescription.setBounds(327, 148, 329, 14);
		add(lblTitreDescription);

		JLabel lblTitrePrix = new JLabel("Prix");
		lblTitrePrix.setBounds(327, 330, 46, 14);
		add(lblTitrePrix);

		// Prix de produit
		tbPrix = new JTextField();
		tbPrix.setHorizontalAlignment(SwingConstants.RIGHT);
		tbPrix.setEditable(false);
		tbPrix.setBounds(404, 327, 255, 20);
		tbPrix.setColumns(10);
		add(tbPrix);

		// Total de la commande
		tbTotal = new JTextField();
		tbTotal.setHorizontalAlignment(SwingConstants.RIGHT);
		tbTotal.setEditable(false);
		tbTotal.setBounds(404, 365, 255, 20);
		tbTotal.setColumns(10);
		add(tbTotal);

		btnConfirmer = new JButton("Confirmer");
		btnConfirmer.setBounds(509, 396, 150, 23);
		btnConfirmer.addActionListener(new ConfirmerListener());
		add(btnConfirmer);

		// Bouton confirmer

		// Affichage des informations du client
		afficherInfoClient();

		// Affichage du panneau
		setVisible(true);
		
		registre.demarrerCommande();
		registre.ajouterObservateur(new ObservateurCommande(listCommande));

	}

	private void afficherInfoClient() {
		lbClient.setText(((Client) registre.getCompteActif()).getProfil()
				.getNom());
		lbClientInfo.setText(((Client) registre.getCompteActif()).getProfil()
				.getNoTelephone());
	}

	private void closeWindow() {
		this.setVisible(false);
	}

	// ComboBox de restaurants Listener
	class RestaurantListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {

			// Initialisation de la liste des produits affiches
			Restaurant resto = (Restaurant) cbRestaurant.getSelectedItem();
			listMenu.setListData(resto.getMenu().getListe());

		}

	}

	// Liste de produits Listener
	class ProduitListener implements ListSelectionListener {

		@Override
		public void valueChanged(ListSelectionEvent arg0) {

			Produit produit = (Produit) listMenu.getSelectedValue();

			if (produit != null) {
				// Affiche la description du produit
				tbDescription.setText(produit.getDescription());

				// Affiche le prix du produit
				tbPrix.setText("" + produit.getPrix() + " $");
			}
		}
	}

	// Ajout de produit
	class AjouterListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {

			if (!listMenu.isSelectionEmpty()) {
				try {
					registre.ajouterProduitCommande(
							(Produit) listMenu.getSelectedValue(),
							Integer.parseInt(tbQuantite.getText()));
				} catch (NumberFormatException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}

	}

	// Suppression de produit
	class SupprimerListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {

			if (!listCommande.isSelectionEmpty()) {
				try {

					registre.supprimerProduit(listCommande.getSelectedIndex());
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}

	}

	// Quitter le programme
	class QuitterListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {
			closeWindow();

		}

	}

	// Confirmer la commande
	class ConfirmerListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent arg0) {

			
			try {
				registre.confirmerCommande();
				Confirmation confirmation = new Confirmation(
						registre.commandeActuelle());
				confirmation.setVisible(true);
				closeWindow();

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
}
